# 服务器创建
# 1.socket创建套接字
# 2.bind绑定 IP port
# 3.listen使套接字变为可以被动链接
# 4.accept等待客户端的链接
# 4.recv/send接收发送数据
# 监听套接字 负责 等待新的客户端进行连接
# accept产生新的套接字用来为 客户端服务

import socket


def main():
    # 1.买个手机(创建套接字)
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.插入手机卡(绑定本地信息)
    tcp_server_socket.bind(("", 7890))
    # 3.将手机设置为正常的响铃模式(让默认的套接字有主动变为被动)
    tcp_server_socket.listen(128)
    while True:
        print("等待一个新的客户端到来:...")
        # 4.等待别人的电话到来(等待客户端的链接 accept)出现阻塞直到出现新的用户
        # ,accept会返回新用户的信息(客户端,(新用户的ip,port))
        new_client_socket, client_addr = tcp_server_socket.accept()
        print("一个新的客户端已经到来:%s" % str(client_addr))
        # 循环目的:为同一个客户服务多次
        while True:
            # 接收客户端发送过来的请求
            recv_data = new_client_socket.recv(1024)
            print("客户端发送过来的请求是:%s" % recv_data.decode("gbk"))

            # 如果recv解堵塞,那么有2种方法:
            # 1.客户端发送数据
            # 2.客户端调用close导致recv解堵塞
            if recv_data:
                new_client_socket.send("hahhaha".encode("gbk"))
            else:
                break
            # 关闭套接字
            # 关闭accept返回的套接字 意味着 不会再为这个客户端服务
            #  new_client_socket.close()
    tcp_server_socket.close()


if __name__ == "__main__":
    main()
